const fs = require('fs');
const path = require('path');
const https = require('https');
const http = require('http');

// 创建本地数据存储目录
const LOCAL_DATA_DIR = 'local-data';
const DATA_FILE = path.join(LOCAL_DATA_DIR, 'projects.json');

// 确保本地数据目录存在
function ensureLocalDataDir() {
  if (!fs.existsSync(LOCAL_DATA_DIR)) {
    fs.mkdirSync(LOCAL_DATA_DIR, { recursive: true });
  }
}

// 模拟从远程获取数据
// 在实际使用中，这里应该是真实的HTTP请求代码
function fetchRemoteData() {
  // 模拟数据 - 在实际应用中应该通过HTTP请求获取
  return new Promise((resolve) => {
    // 模拟网络延迟
    setTimeout(() => {
      const mockData = {
        list: [
          {
            flag: 'project1',
            title: '示例项目1',
            desc: '这是第一个示例项目',
            content: '{}',
            updateTime: new Date().toISOString()
          },
          {
            flag: 'project2',
            title: '示例项目2',
            desc: '这是第二个示例项目',
            content: '{}',
            updateTime: new Date().toISOString()
          }
        ],
        count: 2
      };
      
      resolve(mockData);
    }, 1000);
  });
}

// 通过HTTP请求获取真实数据的函数
function fetchRealRemoteData() {
  return new Promise((resolve, reject) => {
    // 这里需要替换为实际的API地址
    // 注意：在开发环境中，由于CORS限制，Node.js脚本可能无法直接访问由webpack-dev-server代理的地址
    const url = 'https://ifront.net/yee-list?pageno=1&pagesize=100'; // 直接访问远程服务器
    
    console.log(`正在从 ${url} 获取数据...`);
    
    const lib = url.startsWith('https') ? https : http;
    
    const request = lib.get(url, (response) => {
      let data = '';
      
      // 检查状态码
      if (response.statusCode !== 200) {
        console.warn(`警告: 服务器返回状态码 ${response.statusCode}`);
      }
      
      // 接收数据片段
      response.on('data', (chunk) => {
        data += chunk;
      });
      
      // 数据接收完成
      response.on('end', () => {
        // 显示响应头信息，有助于调试
        console.log(`响应状态码: ${response.statusCode}`);
        console.log(`内容类型: ${response.headers['content-type']}`);
        
        // 检查内容类型
        const contentType = response.headers['content-type'] || '';
        if (!contentType.includes('application/json')) {
          console.warn('警告: 响应可能不是JSON格式');
          console.log('响应内容前200字符:', data.substring(0, 200));
        }
        
        try {
          const jsonData = JSON.parse(data);
          resolve(jsonData);
        } catch (error) {
          console.error('原始响应数据:', data);
          reject(new Error(`解析响应数据失败: ${error.message}\n响应内容可能不是有效的JSON格式`));
        }
      });
    });
    
    // 处理请求错误
    request.on('error', (error) => {
      reject(new Error(`请求失败: ${error.message}`));
    });
    
    // 设置超时
    request.setTimeout(10000, () => {
      request.destroy();
      reject(new Error('请求超时'));
    });
  });
}

// 从本地开发服务器获取数据（通过文件系统）
function fetchLocalData() {
  return new Promise((resolve, reject) => {
    console.log('正在从本地数据文件获取数据...');
    
    try {
      // 检查本地数据文件是否存在
      if (fs.existsSync(DATA_FILE)) {
        const data = fs.readFileSync(DATA_FILE, 'utf8');
        const jsonData = JSON.parse(data);
        console.log('成功从本地数据文件获取数据');
        resolve(jsonData);
      } else {
        console.log('本地数据文件不存在，使用模拟数据');
        resolve({
          list: [],
          count: 0
        });
      }
    } catch (error) {
      console.error('读取本地数据文件失败:', error.message);
      reject(error);
    }
  });
}

// 保存数据到本地文件
function saveDataToLocal(data) {
  ensureLocalDataDir();
  
  // 将数据写入JSON文件
  fs.writeFileSync(DATA_FILE, JSON.stringify(data, null, 2));
  console.log(`数据已保存到 ${DATA_FILE}`);
}

// 主函数
async function main() {
  try {
    console.log('开始获取数据...');
    console.log('提示：如果无法从远程服务器获取数据，将使用本地数据文件');
    
    let data;
    
    try {
      // 首先尝试从远程获取数据
      console.log('尝试从远程服务器获取数据...');
      data = await fetchRealRemoteData();
      console.log('成功从远程服务器获取数据');
    } catch (remoteError) {
      console.warn('从远程服务器获取数据失败:', remoteError.message);
      console.log('尝试从本地数据文件获取数据...');
      
      try {
        // 如果远程获取失败，尝试从本地文件获取
        data = await fetchLocalData();
      } catch (localError) {
        console.warn('从本地数据文件获取数据失败:', localError.message);
        console.log('使用模拟数据...');
        // 如果本地文件也失败，使用模拟数据
        data = await fetchRemoteData();
      }
    }
    
    console.log('成功获取数据:');
    console.log(JSON.stringify(data, null, 2));
    
    // 保存数据到本地
    saveDataToLocal(data);
    
    console.log('完成!');
  } catch (error) {
    console.error('操作失败:', error.message);
    console.log('\n提示:');
    console.log('1. 确保开发服务器正在运行 (npm run serve)');
    console.log('2. 确认API端点地址正确');
    console.log('3. 如果问题持续存在，可以使用模拟数据功能');
    console.log('   修改脚本中的注释，使用 fetchRemoteData() 替代 fetchRealRemoteData()');
    process.exit(1);
  }
}

// 如果直接运行此脚本，则执行主函数
if (require.main === module) {
  main();
}

module.exports = {
  fetchRemoteData,
  fetchRealRemoteData,
  fetchLocalData,
  saveDataToLocal
};